/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package socof_webcrawler;

import Downloader.SetData;
import java.util.Random;
import DataBase.Coleccao;
import DataBase.Ficheiro;
import java.util.ArrayList;

public class ExecutDownloader implements Runnable {

    private ResizeableSemaphore semaphore;
    ArrayList<Ficheiro> files2Download = new ArrayList<>();
    ArrayList<Ficheiro> filesDownloaded = new ArrayList<>();
    ArrayList<String> downloaded = new ArrayList<>();
    Ficheiro obj = new Ficheiro();
    Coleccao listOfFiles = new Coleccao();
    private SetData downloader = new SetData();

    public ExecutDownloader(ResizeableSemaphore sem) throws InterruptedException {
        this.semaphore = sem;
        this.semaphore.acquire();
    }

    @Override
    public void run() {
        Random generator = new Random();
        files2Download = listOfFiles.getListaDownload(SOCOF_WebCrawler.getDOMAIN());
        filesDownloaded = listOfFiles.getListaComplete(SOCOF_WebCrawler.getDOMAIN());
        System.err.println("downloadLista: " + files2Download.toString());
        boolean result;

        try {
            long downloading = generator.nextInt(100000) + 1;
            Bandwith.getInstance().addDownload(downloading);
            System.out.println("Downloader: " + this.toString() + " started...");
            if (!listOfFiles.getListaDownload(SOCOF_WebCrawler.getDOMAIN()).isEmpty()) {
                obj = listOfFiles.getListaDownload(SOCOF_WebCrawler.getDOMAIN()).get(0);

                if (!this.verificaComplete(obj)) {
                    files2Download.remove(obj);


                    //aqui chamar o SetData om os dados do site
                    listOfFiles.setEstado(obj.getId(), obj.DB_STATE_DOWNLOADING);
                    obj.setEstado(obj.DB_STATE_DOWNLOADING);

                    downloader.Downloader(obj, SOCOF_WebCrawler.getLEVEL());
                    result = false;
                    if (!downloaded.contains(obj.getCaminhosite())) {
                        result = downloader.DownloadFile();
                        obj = downloader.getFicheiro();
                    }
                } else {
                    result = true;
                }
                if (result == true) {
                    obj.verificaTipo();
                    if (this.obj.getTipo().equals(obj.DB_TYPE_BINARY)) {
                        this.obj.setEstado(this.obj.DB_STATE_COMPLETE);
                    } else {
                        this.obj.setEstado(this.obj.DB_STATE_PARSE);
                    }
                } else {
                    this.obj.setEstado(this.obj.DB_STATE_INCOMPLETE);
                }
                listOfFiles.writeData(obj);
                downloaded.add(obj.getCaminhosite());
            } else {
                if (SOCOF_WebCrawler.getINIT() == true) {
                    SOCOF_WebCrawler.setINIT(false);
                    SetData dw = new SetData();

                    dw.Downloader(SOCOF_WebCrawler._DOMAIN, SOCOF_WebCrawler._PATH, SOCOF_WebCrawler._LEVEL);
                    result = dw.DownloadFile();

                    if (result == true) {
                        obj = dw.getFicheiro();
                        if (this.obj.getTipo().equals(obj.DB_TYPE_BINARY)) {
                            this.obj.setEstado(this.obj.DB_STATE_COMPLETE);
                        } else {
                            this.obj.setEstado(this.obj.DB_STATE_PARSE);
                        }
                    } else {
                        this.obj.setEstado(this.obj.DB_STATE_DOWNLOAD);
                    }
                    listOfFiles.writeData(obj);
                } else {
                    Thread.sleep(2000);
                }
            }

            Bandwith.getInstance().removeDownload(downloading);
            System.out.println("Downloader: " + this.toString() + " finished...");
            this.semaphore.release();
        } catch (Exception ex) {
            System.out.println("Algo correu mal ao descarregar o ficheiro: " + obj.getFicheiro());
        }
    }

    private boolean verificaComplete(Ficheiro obj) {
        for (Ficheiro ficheiro : filesDownloaded) {
            if (obj.getFicheiro().equalsIgnoreCase(ficheiro.getFicheiro()) && obj.getCaminhosite().equalsIgnoreCase(ficheiro.getCaminhosite())) {
                return true;
            }
        }
        return false;
    }
}
